function allwords()
  local line = io.read()     -- current line
  local pos = 1              -- current position in the line
  return function ()         -- iterator function
    while line do            -- repeat while there are lines
    local s, e = string.find(line, "%w+", pos)
      if s then              -- found a word?
        pos = e + 1          -- next position is after this word
        return string.sub(line, s, e) -- return the word
      else
        line = io.read()     -- word not found; try next line
        pos = 1              -- restart from first position
      end
    end
    return nil               -- no more lines: end of traversal
  end
end

for word in allwords() do
  print(word)
end